{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# jieba中文处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "和拉丁语系不同，亚洲语言是不用空格分开每个有意义的词的。而当我们进行自然语言处理的时候，大部分情况下，词汇是我们对句子和文章理解的基础，因此需要一个工具去把完整的文本中分解成粒度更细的词。 jieba就是这样一个非常好用的中文工具，是以分词起家的，但是功能比分词要强大很多。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.基本分词函数与用法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator，可以使用 for 循环来获得分词后得到的每一个词语(unicode)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "jieba.cut 方法接受三个输入参数:\n",
    "\n",
    ">  需要分词的字符串<br>\n",
    ">  cut_all 参数用来控制是否采用全模式<br>\n",
    ">  HMM 参数用来控制是否使用 HMM 模型<br>\n",
    "\n",
    "jieba.cut_for_search 方法接受两个参数\n",
    "\n",
    ">  需要分词的字符串<br>\n",
    ">  是否使用 HMM 模型。<br>\n",
    "\n",
    "该方法适合用于搜索引擎构建倒排索引的分词，粒度比较细"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<generator object cut at 0x00000000050E2900>\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Dumping model to file cache c:\\users\\jiangc~1\\appdata\\local\\temp\\jieba.cache\n",
      "Loading model cost 2.026 seconds.\n",
      "Prefix dict has been built succesfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Full Mode: 我/ 在/ 学习/ 自然/ 自然语言/ 语言/ 处理\n",
      "Default Mode: 我/ 在/ 学习/ 自然语言/ 处理\n",
      "他, 毕业, 于, 上海交通大学, ，, 在, 百度, 深度, 学习, 研究院, 进行, 研究\n",
      "小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ，, 后, 在, 哈佛, 大学, 哈佛大学, 深造\n"
     ]
    }
   ],
   "source": [
    "# encoding=utf-8\n",
    "import jieba\n",
    "\n",
    "seg_list = jieba.cut(\"我在学习自然语言处理\",cut_all=True)\n",
    "print seg_list\n",
    "print(\"Full Mode: \" + \"/ \".join(seg_list)) # 全模式\n",
    "\n",
    "seg_list = jieba.cut(\"我在学习自然语言处理\",cut_all=False)\n",
    "print(\"Default Mode: \" + \"/ \".join(seg_list)) # 精确模式\n",
    "\n",
    "seg_list = jieba.cut(\"他毕业于上海交通大学，在百度深度学习研究院进行研究\") # 默认是精确模式\n",
    "print(\", \".join(seg_list))\n",
    "\n",
    "seg_list = jieba.cut_for_search(\"小明硕士毕业于中国科学院计算所，后在哈佛大学深造\") # 搜索引擎模式\n",
    "print(\", \".join(seg_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "** jieba.lcut以及jieba.lcut_for_search直接返回 list **"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[u'\\u5c0f\\u660e', u'\\u7855\\u58eb', u'\\u6bd5\\u4e1a', u'\\u4e8e', u'\\u4e2d\\u56fd\\u79d1\\u5b66\\u9662', u'\\u8ba1\\u7b97\\u6240', u'\\uff0c', u'\\u540e', u'\\u5728', u'\\u54c8\\u4f5b\\u5927\\u5b66', u'\\u6df1\\u9020']\n",
      "小明 硕士 毕业 于 中国科学院 计算所 ， 后 在 哈佛大学 深造\n",
      "小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 ， 后 在 哈佛 大学 哈佛大学 深造\n"
     ]
    }
   ],
   "source": [
    "result_lcut = jieba.lcut(\"小明硕士毕业于中国科学院计算所，后在哈佛大学深造\")\n",
    "print result_lcut\n",
    "print \" \".join(result_lcut)\n",
    "print \" \".join(jieba.lcut_for_search(\"小明硕士毕业于中国科学院计算所，后在哈佛大学深造\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "** 添加用户自定义词典 **"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "很多时候我们需要针对自己的场景进行分词，会有一些领域内的专有词汇。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">1.可以用jieba.load_userdict(file_name)加载用户字典<br>\n",
    ">2.少量的词汇可以自己用下面方法手动添加：<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典<br>\n",
    "用 suggest_freq(segment, tune=True) 可调节单个词语的词频，使其能（或不能）被分出来。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "如果/放到/旧/字典/中将/出错/。\n"
     ]
    }
   ],
   "source": [
    "print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "494"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "jieba.suggest_freq(('中','将'),True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关键词提取"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 基于 TF-IDF 算法的关键词抽取"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "import jieba.analyse jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())<br>\n",
    "    \n",
    "    > * sentence 为待提取的文本\n",
    "    > * topK 为返回几个 TF/IDF 权重最大的关键词，默认值为 20\n",
    "    > * withWeight 为是否一并返回关键词权重值，默认值为 False\n",
    "    > * allowPOS 仅包括指定词性的词，默认值为空，即不筛选"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba.analyse as analyse\n",
    "lines = open('./6/NBA.txt').read()\n",
    "print \"  \".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))\n",
    "print \"---------------------我是分割线----------------\"\n",
    "print \"  \".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n')))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
